---@meta

---
---
---[查看文档](command:extension.lua.doc?["en-us/54/manual.html/pdf-io"])
---
---@class io*
---
---标准输入。
---
---[查看文档](command:extension.lua.doc?["en-us/54/manual.html/pdf-io.stdin"])
---
---@field stdin  file*
---
---标准输出。
---
---[查看文档](command:extension.lua.doc?["en-us/54/manual.html/pdf-io.stdout"])
---
---@field stdout file*
---
---标准错误。
---
---[查看文档](command:extension.lua.doc?["en-us/54/manual.html/pdf-io.stderr"])
---
---@field stderr file*
io = {}

---@alias openmode
---|>'"r"'   # 读模式。
---| '"w"'   # 写模式。
---| '"a"'   # 追加模式。
---| '"r+"'  # 更新模式，所有之前的数据都保留。
---| '"w+"'  # 更新模式，所有之前的数据都删除。
---| '"a+"'  # 追加更新模式，所有之前的数据都保留，只允许在文件尾部做写入。
---| '"rb"'  # 读模式。（二进制方式）
---| '"wb"'  # 写模式。（二进制方式）
---| '"ab"'  # 追加模式。（二进制方式）
---| '"r+b"' # 更新模式，所有之前的数据都保留。（二进制方式）
---| '"w+b"' # 更新模式，所有之前的数据都删除。（二进制方式）
---| '"a+b"' # 追加更新模式，所有之前的数据都保留，只允许在文件尾部做写入。（二进制方式）

---
---关闭 `file` 或默认输出文件。
---
---[查看文档](command:extension.lua.doc?["en-us/54/manual.html/pdf-io.close"])
---
---@param file? file*
---@return boolean?  suc
---@return exitcode? exitcode
---@return integer?  code
function io.close(file) end

---
---将写入的数据保存到默认输出文件中。
---
---[查看文档](command:extension.lua.doc?["en-us/54/manual.html/pdf-io.flush"])
---
function io.flush() end

---
---设置 `file` 为默认输入文件。
---
---[查看文档](command:extension.lua.doc?["en-us/54/manual.html/pdf-io.input"])
---
---@overload fun():file*
---@param file string|file*
function io.input(file) end

---
---------
---```lua
---for c in io.lines(filename, ...) do
---    body
---end
---```
---
---[查看文档](command:extension.lua.doc?["en-us/54/manual.html/pdf-io.lines"])
---
---@param filename string?
---@vararg readmode
---@return fun():string|number
function io.lines(filename, ...) end

---
---用字符串 `mode` 指定的模式打开一个文件。
---
---[查看文档](command:extension.lua.doc?["en-us/54/manual.html/pdf-io.open"])
---
---@param filename string
---@param mode     openmode
---@return file*?
---@return string? errmsg
function io.open(filename, mode) end

---
---设置 `file` 为默认输出文件。
---
---[查看文档](command:extension.lua.doc?["en-us/54/manual.html/pdf-io.output"])
---
---@overload fun():file*
---@param file string|file*
function io.output(file) end

---@alias popenmode
---| '"r"' # 从这个程序中读取数据。（二进制方式）
---| '"w"' # 向这个程序写入输入。（二进制方式）

---
---用一个分离进程开启程序 `prog` 。
---
---[查看文档](command:extension.lua.doc?["en-us/54/manual.html/pdf-io.popen"])
---
---@param prog  string
---@param mode? popenmode
---@return file*?
---@return string? errmsg
function io.popen(prog, mode) end

---
---读文件 `file`， 指定的格式决定了要读什么。
---
---[查看文档](command:extension.lua.doc?["en-us/54/manual.html/pdf-io.read"])
---
---@vararg readmode
---@return string|number
---@return ...
function io.read(...) end

---
---如果成功，返回一个临时文件的句柄。
---
---[查看文档](command:extension.lua.doc?["en-us/54/manual.html/pdf-io.tmpfile"])
---
---@return file*
function io.tmpfile() end

---@alias filetype
---| '"file"'        # 是一个打开的文件句柄。
---| '"closed file"' # 是一个关闭的文件句柄。
---| 'nil'           # 不是文件句柄。

---
---检查 `obj` 是否是合法的文件句柄。
---
---[查看文档](command:extension.lua.doc?["en-us/54/manual.html/pdf-io.type"])
---
---@param file file*
---@return filetype
function io.type(file) end

---
---将参数的值逐个写入默认输出文件。
---
---[查看文档](command:extension.lua.doc?["en-us/54/manual.html/pdf-io.write"])
---
---@return file*
---@return string? errmsg
function io.write(...) end

return io
